home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / iapl / manual / new / ch4 next >
Encoding:
Text File  |  1995-11-25  |  21.5 KB  |  345 lines

  1. ---- Chapter 4: Using I-APL on the Atari ST -----------------------------------
  2.  
  3. This chapter explains how to use I-APL on the ST.  Sections describe: How to
  4. start I-APL; how to enter APL characters from the keyboard; the Direct
  5. Definition facility; certain useful built-in functions; the Screen Editor;
  6. loading and saving workspaces; and the concept of modules & how to use them,
  7. including printer drivers.
  8.  
  9. ---- 4.1  Starting I-APL ------------------------------------------------------
  10.  
  11. I-APL runs on any ST.  It will display the entire APL character set in both
  12. medium and high resolutions.
  13.  
  14. To start I-APL, double click on the IAPL.TOS icon.  Alternatively, to save
  15. memory, the IAPL.TOS program can be copied into an AUTO folder, and renamed
  16. as IAPL.PRG.  I-APL will then run automatically when the machine is turned
  17. on or reset with the disk in drive A.  Around 30K of memory is gained using
  18. this method.
  19.  
  20. To exit I-APL type ')OFF'.
  21.     
  22. ---- 4.2  Using the keyboard --------------------------------------------------
  23.  
  24. To allow entry of the special APL characters, the IAPL.TOS program has an APL
  25. keyboard mode in which certain keys produce different characters.  I-APL
  26. starts off in this mode, and you can switch to and from the normal keyboard
  27. layout using the TAB key.
  28.  
  29. In APL mode, the following keys give their normal characters:
  30.  
  31.  A-Z 0-9 ! ' ( ) * + , - . / : ; < = > ? [ \ ] ^ ~
  32.  
  33. The shifted letters and other symbols are converted as follows:
  34.  
  35.  {table as in PC/BBC/Arch manual}
  36.  
  37. Lower case letters can be entered either by switching back to the normal
  38. keyboard layout using TAB, or by holding Control down whilst entering the
  39. letters in APL mode.
  40.  
  41. Some additional APL characters are available by entering ALT + one of the
  42. digits along the top of the keyboard.  The characters produced are as follows:
  43.  
  44.  1     2          3    4     5       6       7           8   9   0
  45.  cents high-minus hash delta u-delta o-minus comma-minus lev nor nand
  46.  {replace these with symbols - see help screen bit WS@Ç@Æ⇧ÇÉ≡æpp⇩⓪üijéΣÿ⇧d ⇨⇧PÇ@Æ⇩sf`Ç`Æ⇩sfpÇ|Æ⇩sfÇÇÿÆ⇩sfÉÇœÆ⇩sfáÇסÆ⇩sfãÇ∮Æ⇩sfijÇ✓ô⇧sסÇ$ô⇧s
  47. αÇ@ô⇧s ≡Ç\ô⇧s♪üxô⇧s
  48.  üöô⇨s╱0ÇÉ»0üãô⇩s❎Püכô⇧aÉütò⇩sfpüץô⇩s⇦áü(ö⇧aÇü°ô⇩s⇩`ü④ö⇧aαüÉò⇩sfijü8ö⇩s◆≡üÇö⇧aסüTö⇩s⇨ãüpö⇧a@é¼ò⇩sféÉö⇩s⇧⓪é¼ö⇧a é¶ö⇧k0éזö⇧l@ü⌠ö⇧`éכò⇧aâ⌠ù⇧táéץò⇧aÉéסù⇧tpéijù⇧aαéץù⇧tãé∮ò⇧lסépû⇧l@ä≡ÿ⇧d⓪âêû⇦sPéΦù⇧dαâáÿ⇧t`âÿ⇨s âñû⇧t@âגû⇧a⓪ä@ÿ⇧tPâקû⇨spâ≡û⇧aÇâÿ⇧tÉâ⇦ù⇧a≡â(ÿ⇧táâ④ù⇧lãâpù\sijâîù9sÇé¿ù⇧lPå$á⇧aäזÿ⇧a0â4ÿ⇧d Çןÿ⇧t äLÿ⇩s0ähÿ⇩sq≡éäÿ⇩sqPäⁿÿ⇩s`äÖ⇧tÉà<Ö⇧lPà<Ü⇧lÉäp£⇧lçג£⇧lpä0Ü⇧d@àœ¢⇧aסähÖ⇧tαäÿÖ⇨s≡äœÖ    sàסÖ⇧lÇàÜ⇧lãäö¢⇧t⓪ëÿó⇧t`àñÜ⇧dãàג¢⇧apàTÜ⇧tסàãÜ⇧l0àîÜ⇧l å⑧Ü⇧tijä\Ö⇧dijà`¢⇧d0åק¢⇧l≡àl¢⇩sαàזÜ⇧tå¢⇧a⓪àê¢⇧t⓪å④¢⇧láàH¢⇧láä$Ü⇧t≡å⑧£⇧láèɪ⇧tÇç4á⇧tÇåLƒ⇧d⓪çPá⇧tãåXƒ⇩sáå°¥⇧tijåß⇧aסåtƒ⇧tαå,ß⇧a çǃ⇧t@ç<ß⇧láç0£⇧lÉçץ£⇧l0ç\á⇧aסçîƒ⇧dÇêlá⇧tPçäß⇧t`çáß⇦spç¶ß⇧l`å4ƒ⇧lpå@á⇧a0ël¥⇧lijçH£⇧dסâ⑧á⇧tÇäT£⇩sαçÿƒ⇧t≡çגƒ⇧aêקƒ⇧tDFTYPE is to convert vectors to/from character
  49.     vectors for reading/writing with DFREAD/DFWRITE.  In this case, problems
  50.     are only likely to occur in converting boolean vectors.  The vector
  51.     should be padded out so that the length is a multiple of 8.  The
  52.     following expression will do this for boolean vector X: X,(7-8|(pX)-1)p0
  53.  
  54. Example use of the DFILE functions:
  55.  
  56. {example text as in EX1}
  57.  
  58. ---- 5.2  USEFUL functions ----------------------------------------------------
  59.  
  60. The USEFUL workspace contains a collection of 'useful' functions that do not
  61. belong anywhere else.  Several of the functions included have already been
  62. described in the printer driver section.  See that section for details on those
  63. functions.  These are the remaining functions:
  64.  
  65. RGBBACK red green blue
  66. RGBTEXT red green blue
  67.     These two commands are used to set the colours for the command screen.
  68.     'red', 'green' and 'blue' are the levels of intensity for the three
  69.     colours, from 0 to 15 (black to full intensity; STE compatible).
  70.     RGBBACK sets the background colour; RGBTEXT sets the colour for the
  71.     text.  On a mono system, RGBBACK can be used to switch between black
  72.     on white and white on black: use RGBBACK 15 15 15 or RGBBACK 0 0 0.
  73. KBRATE delay repeat
  74.     This sets the keyboard repeat rate; 'delay' is the time before a key
  75.     starts to repeat, 'repeat' is the time between repeats.  Both times
  76.     are measured in 50ths of a second.
  77. INKEY
  78.     Wait for a key and return its value as a character scalar.  Whilst the
  79.     command is waiting, the COPY cursor works as usual, and so do UNDO and
  80.     the function keys.  The other special keys return special characters;
  81.     in the following list a number X represents the character #AV[#IO+X]:
  82.     1 Left, 2 Right, 3 ToStart, 4 ToEnd, 5 ClearToStart, 6 ClearToEnd,
  83.     8 Backspace, 13 Return (or Enter), 27 Escape, and 127 Delete.  Note
  84.     that Escape does not cause an interrupt; it is returned like any other
  85.     key.
  86. clear INBUF string
  87.     This command puts keypresses into the keyboard buffer; the keypresses
  88.     are those in character vector 'string'.  Any normal characters may be
  89.     used, and in addition those returned by INKEY above.  The keypresses
  90.     are inserted at the end of the buffer; ie they become the next 
  91.     keypresses to be read.  'clear' is either 0 or 1: if it is one then
  92.     the keyboard buffer is cleared before the keypresses are inserted.
  93.     If the buffer becomes full then no warning is given - the excess keys
  94.     are discarded.  You will find that the excess keys are discarded from
  95.     the beginning rather than the end of the string.
  96. WSDOC string
  97.     This lists all the functions in the workspace whose names begin with
  98.     the characters contained in 'string'.  It is possible for 'string' to
  99.     be '', producing a list all functions.
  100. DDDOC string
  101.     As for WSDOC above, except that only direct definition functions are
  102.     listed.
  103. DFDOC string
  104.     As for WSDOC, except that only defined functions are listed.
  105. SUMMARY
  106.     Displays a summary of all the functions in the workspace using their
  107.     comments.
  108.  
  109. Examples:
  110.  
  111. {example text as in EX2}
  112.  
  113. ---- 5.3  Full screen text functions ------------------------------------------
  114.  
  115. The functions found in the FSCREEN workspace (Full SCREEN text) are used to
  116. control the text display on the command screen.  Text can be written to the
  117. screen and read off it.  The cursor can be moved, and the scrolling output
  118. window normally used for text display can be restricted to a smaller portion
  119. of the screen.
  120.  
  121. Coordinates of character cells are given as two-element vectors of the form:
  122. (row,column).  The top row is row 0, and the left-most column is column 0.
  123.  
  124. FSLIMITS
  125.     This function returns the size of the full text screen.  The result is
  126.     a two-element integer vector containing the number of rows and columns,
  127.     respectively, on the screen.
  128. ~a FSPUT row column
  129.     Puts a character scalar, vector or 2-dimensional array ~a onto the
  130.     screen with the top-left corner of the block of text at position
  131.     (row,column).  Characters that would be off the screen are ignored.
  132.     The function returns 0 0p0.
  133. FSGET row col nrows ncols
  134.     Gets a block of characters off the screen.  The block is 'nrows' rows
  135.     high and 'ncols' columns wide, and its top-left corner is at (row,col).
  136.     The block is returned as a 2-dimensional character array.  Any
  137.     characters in the block that are off the screen are returned as spaces
  138.     in the array.
  139. char FSFILL row col nrows ncols
  140.     Fills an area of the screen with a single character 'char' (a character
  141.     scalar).  The area is 'nrows' high and 'ncols' wide, with its top-left
  142.     corner at (row,col).  If part of the area is off the screen, then this
  143.     part is ignored.  The function returns 0 0p0.
  144. FSCURSOR ~i0
  145.     The current cursor position is returned as a two-element vector
  146.     containing the row and column positions respectively.
  147. FSCURSOR row column
  148.     The cursor is moved to the position (row,column), and the previous
  149.     cursor position is returned as a two-element vector.  If the new cursor
  150.     position is off the screen then the old position is retained.  Note
  151.     that all printing and input occurs at the cursor position, so moving
  152.     the cursor allows this to be controlled.
  153. FSWINDOW row col nrows ncols
  154.     This sets the size and position of the scrolling window used for normal
  155.     character input and output of text.  The window is set to be 'nrows'
  156.     high and 'ncols' wide, with its top-left at (row,col).  If the window
  157.     specified is not entirely inside the full screen, then nothing happens.
  158.     Otherwise the new window is set and the cursor is moved to the top-left
  159.     corner of this new window, in other words to (row,col).  The window is
  160.     not cleared.  The function returns 0 0p0.
  161.  
  162. Note that changing the position and size of the scrolling window has no effect
  163. at all on the coordinates used to describe character positions - (0,0) still
  164. refers to the top-left corner of the full screen, whatever the position of the
  165. window.  Also note that, although quad and quote-quad input and output can't
  166. change the screen outside the window, the FS functions can still freely use the
  167. whole screen.
  168.  
  169. FSWINDOW does not change #PW.  This means that I-APL may try to display arrays
  170. etc. wider than the window in use.  Characters printed beyond the right edge
  171. of the window are ignored.  Pressing Escape restores the scrolling window to
  172. the full screen again.
  173.  
  174. For programs designed to work on the ST in all modes, a maximum screen size of
  175. 25 rows and 80 columns must be used, even though 33 rows are available in high
  176. resolution.
  177.  
  178. Examples:
  179.  
  180. {example text as in EX3}
  181.  
  182. ---- 5.4  The pixel graphics functions ----------------------------------------
  183.  
  184. The pixel graphics functions are designed to allow the display of points,
  185. lines, triangles, blocks and text in all three of the ST's screen modes.  They
  186. also have the feature of emulating a screen mode if it is not available; so,
  187. for example a program that generates a low resolution colour picture will still
  188. run with a monochrome monitor, only using shades instead of colours.
  189.  
  190. To use the pixel graphics functions contained in the PGRAPH workspace, the
  191. PGRAPH module must be installed - ie it should appear in the module list when
  192. I-APL starts up; see the end of chapter 4 if it is not installed.  When this
  193. module is installed, a separate graphics screen is created.  This screen is
  194. completely independent of the main (command) screen, so pictures can be built
  195. up bit by bit with direct commands without the display becoming corrupted.  To
  196. switch between the two screens use the UNDO key.  The graphics screen is
  197. automatically displayed when it is cleared (using PGCLS), and the command
  198. screen is switched to whenever a keyboard input is required.
  199.  
  200. The graphics functions offer four modes (numbered 0 to 3).  Mode 0 is low
  201. resolution colour with 16 colours available (0-15).  The default palette (which
  202. is set whenever the screen is cleared) has 0,1,14,15 as black, dark grey, light
  203. grey and white, and colours 2 to 13 as the colours round the colour wheel - see
  204. the examples.  The palette can be redefined after the screen has been cleared
  205. if necessary.
  206.  
  207. Mode 1 is medium resolution colour with 4 colours.  The default colours for 0
  208. to 3 are: black, red, yellow and white.  Mode 2 is high resolution monochrome
  209. with 17 shades available, from 0 (the background colour) to 16 (the foreground
  210. colour).  Lines are drawn thickened, as if with points of 2x2 (hi-res) pixels.
  211. This makes the shades of lines more obvious and also allows the medium res
  212. colour emulation of the hi-res screen to look almost identical.  This mode is
  213. the best for producing near-identical output on all ST's.
  214.  
  215. Mode 3 is another high resolution mode, again with 17 shades.  However in this
  216. mode lines are drawn thin on a hi-res screen.  This allows finely detailed
  217. displays to be built up; but note that the medium resolution emulation uses
  218. thick lines - as if mode 2 was used.
  219.  
  220. There are three further modes used internally - modes 4, 5 and 6.  These are
  221. the emulation modes.  Mode 4 is mode 0 emulated on monochrome, using shades to
  222. represent the colours.  Mode 5 is mode 1 emulated on monochrome, again using
  223. shades for colours.  Mode 6 is the medium resolution emulation of both modes 2
  224. and 3; 17 shades are used, but the vertical resolution is half that of a
  225. monochrome screen.  These modes do not need to be selected directly - they are
  226. switched to automatically if the requested mode (0-3) is not available.
  227.  
  228. The coordinate system used is the same in all the modes.  The top-left corner
  229. of the screen is the origin (0,0); the bottom-right corner is (639,399).  In
  230. other words, the screen is treated as having 640x400 pixels, even if low or
  231. medium resolution is being used.  For the colour modes, these 'logical'
  232. coordinates (based on 640x400) are converted internally to the actual
  233. 'physical' coordinates of the screen being used (either 320x200 or 640x200)
  234. whenever an object is drawn.  These conversions are invisible - you can act as
  235. if you had a 640x400 screen.
  236.  
  237. All of the drawing commands perform full clipping.  In other words, if you try
  238. to draw an object that is partially or completely off the screen, there will
  239. be no problem;  the command will produce a result as if the 640x400 screen is
  240. just a window on a much larger drawing surface.
  241.  
  242. These are the commands; they all return 0 0p0.  Note that where a lower-case
  243. name is included in a command description, it should be replaced by the
  244. relevant number or list of numbers.  If a variable is to be used instead,
  245. remember to join it to any other numbers or variables forming the vector with
  246. the comma ('join') operator.  If a name is in square brackets, this indicates
  247. that it is optional.  A list of names in curly brackets indicates a sequence
  248. that can be repeated over and over.  See the examples if you are confused.
  249.  
  250. 'colour' represents a colour or shade; ie a number from 0-15, 0-3 or 0-16
  251. depending on the mode.
  252.  
  253. PGCLS mode [ colour ]
  254.     Clear the graphics screen, and set it up for mode 'mode' (0 to 3).  The
  255.     screen is cleared to colour (or shade) 'colour', or by default to
  256.     colour 0.  The origin is set to be (0,0) and the plot style is reset to
  257.     be dots.  The palette is initialised for colour modes.  This command
  258.     also displays the graphics screen.
  259. [ colour ] PGRGB { red green blue }
  260.     Set the colour palette for mode 0 or 1, starting at colour 'colour' 
  261.     (defaulting to colour 0).  The right argument is taken in chunks of
  262.     three integers.  Each group of three integers represents one colour;
  263.     the integers represent the red, green and blue levels (respectively)
  264.     for the colour required, on a scale from 0 to 15 (black to full
  265.     intensity).  As many palette colours are set as there are groups of
  266.     three integers on the right.
  267.  
  268. Note that, whereas on a colour screen PGRGB changes the colours actually
  269. displayed on the screen, in the monochrome emulation PGRGB has no effect on the
  270. displayed screen; it only changes the shades used to plot future objects.
  271.  
  272. The following commands all draw a number of graphic objects; the right argument
  273. contains the list of coordinates, and the left argument contains the list of
  274. colours or shades ('clist').  There may be less colours (or shades) listed than
  275. there are objects to be drawn; in this case the list of colours is repeated
  276. over and over until all the objects are done.  So, for example, if 'clist'
  277. consisted of a single colour, then this colour would be used for all the
  278. objects; if a pair of colours were given then these would be used alternately;
  279. and so on.  If no colour list is given then the default colour is used - which
  280. is 15, 3, 16 or 16, respectively, for modes 0 to 3.
  281.  
  282. [ clist ] PGPLOT { x y }
  283.     Plot the points listed on the right with the colours on the left.
  284.     Normally the points are plotted as dots, but if a different point
  285.     style has been set up with PGSTYLE then this is used instead.
  286. [ clist ] PGLINE { x1 y1 x2 y2 }
  287.     Draw the lines listed on the right.  Each group of four integers is
  288.     treated as a pair of coordinates; the line is drawn from (x1,y1) to
  289.     (x2,y2).
  290. [ clist ] PGDRAW { dx dy }
  291.     Draw lines relative; each pair of coordinates is taken to be an offset
  292.     from the last point plotted or drawn to.  A line is drawn from the last
  293.     point to this new point.  This continues until the list is exhausted.
  294.     So, for example 'PGDRAW 0 10 10 0 0 ~`10 ~`10 0' draws a square with a
  295.     corner on the last point plotted or drawn to.
  296. [ clist ] PGTRIANG { x1 y1 x2 y2 x3 y3 }
  297.     Draw filled in triangles; each group of six integers on the right is
  298.     taken as three coordinates, which form the three corners of the
  299.     triangle to be drawn.
  300. [ clist ] PGBLOCK { x1 y1 x2 y2 }
  301.     Draw filled in blocks; (x1,y1) and (x2,y2) are any two opposite
  302.     corners of the (rectangular) block to be drawn.
  303.  
  304. Note that, although all the right arguments above have been specified to be
  305. vectors, any shape of array of integers may be used; the array is effectively
  306. reshaped to a vector and then split up into groups of integers corresponding to
  307. the objects to be drawn.  So, for example, when drawing triangles, it is often
  308. easier to work with an array of six columns in which each row represents one
  309. triangle.  This array can be passed directly to PGTRIANG for drawing.
  310.  
  311. PGORIGIN x y
  312.     This sets the graphics origin to position (x,y) relative to the
  313.     top-left corner of the screen.  This new origin affects all of the
  314.     following commands.  So, if 'PGORIGIN 320 200' is executed, all
  315.     commands would now act as if (0,0) was at the centre of the screen.
  316.     Top-left would be (-320,-200) and bottom-right would be (319,199).
  317.     The only command that is immune to this origin change is PGORIGIN
  318.     itself.
  319. PGSTYLE { x1 y1 x2 y2 }
  320.     As was mentioned above, you can change the style in which points are
  321.     displayed by PGPLOT to something other than dots.  The new shape
  322.     required must be specified as a series of lines whose coordinates are
  323.     given relative to the point to be plotted: (x1,y1) to (x2,y2).  A
  324.     maximum of 8 lines may be used.  For example, after the command:
  325.     'PGSTYLE 10 0 ~`10 0 0 10 0 ~`10', all points would be plotted as
  326.     crosses.  To set the point style back to dots, pass a null vector on
  327.     the right (ie ~i0).
  328. x y [ handle [ colour ] ] PGTEXT text
  329.     This command displays text on the screen; 'text' may be a character
  330.     scalar, vector of characters, or two-dimensional array of characters.
  331.     The font used is the system 6x6 font, with APL characters added.  It is
  332.     displayed 12 pixels high and 6 pixels wide in all modes except mode 0
  333.     in which it is displayed in 12x12 pixels (using 640x400 coords).  The
  334.     reason for not allowing 6x6 in high resolution is that this would make
  335.     the text unreadable when emulated in medium resolution.
  336.       'x' and 'y' usually give the coordinate of the top-left corner of the
  337.     resulting block of text.  However if 'handle' is present, then this
  338.     specifies that (x,y) is the coordinate of a different point on the
  339.     block.  'handle' is a number from 1 to 9 - the meaning is made clear by
  340.     looking at your numeric keypad.  The normal value is 7 - specifying the
  341.     top-left corner.  If you want to place the block according to its
  342.     centre use 5; if by the mid-point on its bottom edge use 2; and so inter driver         JSP=חz=חÕ=ח´=ט4#ΦD=ם⌠By=ם°?<¯¯?<!NNXO⇩@¯≡@⇦??<!NNXOBy=ם∈#ⁿ=ט∈=ם≡NuNu *⇦U@k""g SAg6pNuS@k¯°By=ם∈#ⁿ=ט∈=ם≡Jbf②3ⁿ⇧=ם∈#ⁿ=פ∈=ם≡p⇧Nu&z⓪∈S@k¯ג0"ã|
  343. d¯´vHåijpNôpANô0⇨NôpNôp2Nôp⇧Nu2⇩@¯αIg"Ø|
  344. g(A·⓪œ0:⓪«סijã|xd
  345. R@3ij=ם°⓪üNua" y=ם⌠Nסa⑥ y=ם⌠p
  346. NÉ y=ם⌠p
  347. Nס?/ 69=ם°By=ם°I·⓪dSCkL 4 0g⌠RC&z⓪LpNôpYJy=ם∈f⇩pLNô0⇨τHNô0⇨ΩHNôSCp⓪/ (z⓪τHןijx◆⓪NôQכ¯·(_Qי¯Σ(_0Nu³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³³³é³··αααα$~~$~~$$tשש\Hfl⑧0fF ^≥´∮N
  348. αα|³הééה³|⓪④xx④⓪⓪⓪||⓪⓪⇧◆╱⓪⓪⓪⓪⓪⓪╱╱╱ ⑧0`ij|³Æó³|⇩B³³⇩⇩BהÄÜ≥bäåó≥∧î⑧8h³³✓Σµóó®£|³ÆÆß ÇÄßãαijl³ÆÆ³l`≥Æûⁿxll⇩nl⓪8lהé((((((éהl8⓪@ijèÜ≡`|³é´Ωz>~זז~>³³ÆÆ³l|³ééהD³³éה|8³³ÆÆÆé³³ÉÉÉÇ|³éÆßß³³⓪⓪³³é³³é⇦╱⇩⇩³ⁿ³³8lהé³³⇩⇩⇩⇩³³`0`³³³³p8³³|³éé³|³³ÉÉ≡`|³èä³z³³Éÿ³fd÷ÆÆ∧LÇdz³ÇÇⁿ³⇩⇩³³°ⁿ╱╱ⁿ°³³ ⑧ ³³ה∈88∈הα≡≡αåÄÜØΓא³³ééij`0⑧ ╱éé³³⓪0`ij`0⓪⇩⇩⇩⇩⇩⇩⇩@`0⓪⇦.**>³³"">>""">""³³>**:⑧ ~³áá⑨=%%?>³³  >"®®⇩⇧⇧™®³³✓6"é³³⇩>>0⑧0>>>  >>"">??"">>""??>>  0⓪②:**.$  |~""<>⇩⇩>>8<╱╱<88>╱ ╱>8"66"9=❎❎?>"&.:2"⓪|∈éé∈∈éé∈|⓪0``0⑧⑧0³³é³@ן£שRקÿÇÇÇÇ⓪8lהéD(⓪x|⇦⇦|x8|DDDDDDDD|8<|@@|<||⓪⓪⓪⓪⓪⓪⓪⓪||DD||DD⑧|³ØÜ³